BigQuery ML
Doc
Links
WITH
中間クエリの WITH は CREAT MODEL ... AS 以降に書く必要がある
CREATE MODEL ... AS WITH ... AS SELECT みたいになって変だけどそういうもの
ゼロ埋め
ARIMA などで飛び飛びの値に対して適用すると結果列も飛び飛びになる
日付バケットを作ってゼロで埋めたり
code:fill.sql
WITH params AS (
SELECT
DATE "2021-12-01" as since,
DATE "2021-12-31" as until,
), date_bucket AS (
SELECT bucket FROM params, UNNEST(GENERATE_DATE_ARRAY(params.since, params.until)) AS bucket
)
SELECT
bucket,
IFNULL(SUM(revenue), 0) AS revenue
FROM data_bucket LEFT JOIN some.your.table ON bucket = DATE(timestamp);
code:fill_cross_join.sql
WITH params AS (
SELECT
DATE "2021-12-01" as since,
DATE "2021-12-31" as until,
), date_bucket AS (
SELECT bucket FROM params, UNNEST(GENERATE_DATE_ARRAY(params.since, params.until)) AS bucket
), data AS (
SELECT date, service, revenue FROM some.your.table
), table AS ( -- CROSS JOIN して全組み合わせの集計テーブルを用意しておく
SELECT bucket as date, service
FROM date_bucket
CROSS JOIN (SELECT DISTINCT(service) as service FROM data)
)
SELECT date, service, IFNULL(SUM(revenue), 0) AS revenue
FROM table LEFT JOIN some.your.table USING(date, service) GROUP BY date, service
素振り
ペンギンの体重知りたすぎる
CREATE MODEL でモデルを作る
model_type & input_label_cols
model_type="LINEAR_REG"
ML.TRAINING_INFO で統計情報を確認
コンソールのグラフでまあいい
ML.EVALUATE で評価
評価指標をみる、何が大事かはモデルによっていろいろ
ML.PREDICT で予測
predicted_<label_column_name>
ML.EXPLAIN_PREDICT で予測結果の説明
行ごとにどの特徴が予測に影響しているかみる
Sharpley Value
まずデータ見るのいいね
同じデータを異なる形式で表している行をみつける
トレーニングデータをまとめるビューを作る
重複するカテゴリ変数を除く、トレーニングデータ、評価データ、予測に使うデータを分けている
CREATE MODEL
model_type="LOGISTIC_REG"
auto_class_weights=TRUE
ラベルの登場回数のバランスを取る
各クラスの頻度に反比例した重みを計算して使う
しれっと次の実行するクエリが変わってるな... なんか functional_weight といいおかしい
まずこういう MODEL_TYPE ごとのドキュメントみてどういうオプションがあるのかみるのがよさそう
data_split_method="NO_SPLIT"
入力データをトレーニングセットと評価セットに分ける、ここでは View 作るときに分けているのでいらない
AUTO_SPLIT はデータ量によっていい感じに分ける、5万行未満なら2割が評価に回る
max_iterations=15
お前こんな絵かけたのか
https://gyazo.com/24fb38b660012790682846331cb5e3a4
ML.EVALUATE
precision recall accuracy
https://gyazo.com/e81c44d76c68465102eef206fcc35a5f
ML.PREDICT
predicted_income_bracket_probs.label
predicted_income_bracket_probs.prob
そのラベルに属する確率
(predicted_income_bracket = income_bracket) AS correct とかしたら見やすい
ML.GLOBAL_EXPLAIN
ML.EXPLAIN_PREDICT は行ごとに説明してくれるけど全体での特徴の寄与を見たい場合
結婚>教育>仕事
いつも enable_global_explain=TRUE してたらいい気がするけどどうなんだろ?
CREATE MODEL
model_type="MATRIX_FACTORIZATION"
user_col, item_col
l2_reg、num_factors どこからくるの
精度出るやつを見つけるためにチューニングしろって感じだろうけど
明示的 / 暗黙的とは
feedback_type=IMPLICIT が指定されていたら暗黙的
評価が暗黙的かどうか?
行列分解は、定額制のお客様、または Reservations を利用するお客様のみが使用できます。オンデマンドをご利用のお客様には、Flex Slots を利用して行列分解を使用することをおすすめします。
ARIMA is 何
Auto Regressive & Moving Average を Integration したもの
CREATE MODEL
model_type="ARIMA_PLUS"
data_frequency="AUTO_FREQUENCY"
時系列のデータ頻度が推定される
decompose_time_series=TRUE
休日や季節の影響をモデルに保存する
holiday_region="US" みたいなパラメータがある
日付と total_visits しか渡してないけどそういうものなのか
説明変数追加するアルゴリズムは色々あるらしいけど BQML にはない
TIME_SERIES_ID_COL 渡したら複数の時系列について予測できる
ML.ARIMA_EVALUATE
次の 4 つの列(non_seasonal_{p,d,q}、has_drift)でトレーニング パイプライン内の ARIMA モデルを定義します。その後の 3 つの指標(log_likelihood、AIC、variance)は ARIMA モデルの適合プロセスに関連しています。
AIC が最も小さいものが選ばれてる?
42 のモデルの 42 はどこからくる? ARIMA_PLUS
ML.ARIMA_COEFFICIENTS
ML.FORECAST
STRUCT(30 AS horizon, 0.8 AS confidence_level)
30点と信頼度
ML.EXPLAIN_FORECAST
https://gyazo.com/fe2d82ee1b13e55bb0fcb28918251c15
お~
trend ってなに??
データ増えたらハイパーパラメータ調整の次元 AUTO_ARIMA_MAX_ORDER を下げろという話
ARIMA についてぐぐったら出てきた、読み物としておもしろい
学習時に飛び飛びの値を与えてしまうと予測も飛び飛びになる
次の n 点を予測するところで飛び飛びになる
データによっては飛んでる日付に 0 を入れるのも手
次の時系列を予測するアルゴリズムだから、日々使おうとしたら日々学習せんといかんな
TRANSFORM
predict 時に値を加工しなくていいように、学習時に元の値から特徴量への変換ロジックを書いておく
ハイパーパラメータ調整
モデルの種類によっては OPTIONS にハイパーパラメータ調整用のオプションがある
code:linear
CREATE MODEL bqml_tutorial.hp_taxi_tip_model
OPTIONS
(model_type='linear_reg',
num_trials=20,
max_parallel_trials=2) AS ...